1
2
3
4
5
6
7 package io.vavr.collection;
8
9 import io.vavr.Value;
10 import io.vavr.Tuple;
11 import io.vavr.Tuple2;
12 import io.vavr.control.Option;
13 import org.junit.Test;
14
15 import java.math.BigDecimal;
16 import java.util.ArrayList;
17 import java.util.NoSuchElementException;
18 import java.util.Spliterator;
19 import java.util.function.Function;
20 import java.util.function.Supplier;
21 import java.util.stream.Collector;
22
23 public class QueueTest extends AbstractLinearSeqTest {
24
25
26
27 @Override
28 protected <T> Collector<T, ArrayList<T>, Queue<T>> collector() {
29 return Queue.collector();
30 }
31
32 @Override
33 protected <T> Queue<T> empty() {
34 return Queue.empty();
35 }
36
37 @Override
38 protected <T> Queue<T> of(T element) {
39 return Queue.of(element);
40 }
41
42 @SuppressWarnings("varargs")
43 @SafeVarargs
44 @Override
45 protected final <T> Queue<T> of(T... elements) {
46 return Queue.of(elements);
47 }
48
49 @Override
50 protected <T> Queue<T> ofAll(Iterable<? extends T> elements) {
51 return Queue.ofAll(elements);
52 }
53
54 @Override
55 protected <T extends Comparable<? super T>> Queue<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
56 return Queue.ofAll(javaStream);
57 }
58
59 @Override
60 protected Queue<Boolean> ofAll(boolean... elements) {
61 return Queue.ofAll(elements);
62 }
63
64 @Override
65 protected Queue<Byte> ofAll(byte... elements) {
66 return Queue.ofAll(elements);
67 }
68
69 @Override
70 protected Queue<Character> ofAll(char... elements) {
71 return Queue.ofAll(elements);
72 }
73
74 @Override
75 protected Queue<Double> ofAll(double... elements) {
76 return Queue.ofAll(elements);
77 }
78
79 @Override
80 protected Queue<Float> ofAll(float... elements) {
81 return Queue.ofAll(elements);
82 }
83
84 @Override
85 protected Queue<Integer> ofAll(int... elements) {
86 return Queue.ofAll(elements);
87 }
88
89 @Override
90 protected Queue<Long> ofAll(long... elements) {
91 return Queue.ofAll(elements);
92 }
93
94 @Override
95 protected Queue<Short> ofAll(short... elements) {
96 return Queue.ofAll(elements);
97 }
98
99 @Override
100 protected <T> Queue<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
101 return Queue.tabulate(n, f);
102 }
103
104 @Override
105 protected <T> Queue<T> fill(int n, Supplier<? extends T> s) {
106 return Queue.fill(n, s);
107 }
108
109 @Override
110 protected Queue<Character> range(char from, char toExclusive) {
111 return Queue.range(from, toExclusive);
112 }
113
114 @Override
115 protected Queue<Character> rangeBy(char from, char toExclusive, int step) {
116 return Queue.rangeBy(from, toExclusive, step);
117 }
118
119 @Override
120 protected Queue<Double> rangeBy(double from, double toExclusive, double step) {
121 return Queue.rangeBy(from, toExclusive, step);
122 }
123
124 @Override
125 protected Queue<Integer> range(int from, int toExclusive) {
126 return Queue.range(from, toExclusive);
127 }
128
129 @Override
130 protected Queue<Integer> rangeBy(int from, int toExclusive, int step) {
131 return Queue.rangeBy(from, toExclusive, step);
132 }
133
134 @Override
135 protected Queue<Long> range(long from, long toExclusive) {
136 return Queue.range(from, toExclusive);
137 }
138
139 @Override
140 protected Queue<Long> rangeBy(long from, long toExclusive, long step) {
141 return Queue.rangeBy(from, toExclusive, step);
142 }
143
144 @Override
145 protected Queue<Character> rangeClosed(char from, char toInclusive) {
146 return Queue.rangeClosed(from, toInclusive);
147 }
148
149 @Override
150 protected Queue<Character> rangeClosedBy(char from, char toInclusive, int step) {
151 return Queue.rangeClosedBy(from, toInclusive, step);
152 }
153
154 @Override
155 protected Queue<Double> rangeClosedBy(double from, double toInclusive, double step) {
156 return Queue.rangeClosedBy(from, toInclusive, step);
157 }
158
159 @Override
160 protected Queue<Integer> rangeClosed(int from, int toInclusive) {
161 return Queue.rangeClosed(from, toInclusive);
162 }
163
164 @Override
165 protected Queue<Integer> rangeClosedBy(int from, int toInclusive, int step) {
166 return Queue.rangeClosedBy(from, toInclusive, step);
167 }
168
169 @Override
170 protected Queue<Long> rangeClosed(long from, long toInclusive) {
171 return Queue.rangeClosed(from, toInclusive);
172 }
173
174 @Override
175 protected Queue<Long> rangeClosedBy(long from, long toInclusive, long step) {
176 return Queue.rangeClosedBy(from, toInclusive, step);
177 }
178
179 @Override
180 @SuppressWarnings("unchecked")
181 protected <T> Queue<Queue<T>> transpose(Seq<? extends Seq<T>> rows) {
182 return Queue.transpose((Queue<Queue<T>>) rows);
183 }
184
185 @Override
186 protected int getPeekNonNilPerformingAnAction() {
187 return 1;
188 }
189
190 @Override
191 protected boolean useIsEqualToInsteadOfIsSameAs() {
192 return false;
193 }
194
195
196
197 @Test
198 public void shouldNarrowQueue() {
199 final Queue<Double> doubles = of(1.0d);
200 final Queue<Number> numbers = Queue.narrow(doubles);
201 final int actual = numbers.enqueue(new BigDecimal("2.0")).sum().intValue();
202 assertThat(actual).isEqualTo(3);
203 }
204
205
206
207 @Test(expected = NoSuchElementException.class)
208 public void shouldFailPeekOfEmpty() {
209 Queue.empty().peek();
210 }
211
212 @Test
213 public void shouldReturnPeekOfNonEmpty() {
214 assertThat(Queue.of(1).peek()).isEqualTo(1);
215 }
216
217 @Test
218 public void shouldReturnPeekOption() {
219 assertThat(Queue.empty().peekOption()).isEqualTo(Option.none());
220 assertThat(Queue.of(1).peekOption()).isEqualTo(Option.of(1));
221 }
222
223
224
225 @Test(expected = NoSuchElementException.class)
226 public void shouldFailDequeueOfEmpty() {
227 Queue.empty().dequeue();
228 }
229
230 @Test
231 public void shouldDequeueOfNonEmpty() {
232 assertThat(Queue.of(1, 2, 3).dequeue()).isEqualTo(Tuple.of(1, Queue.of(2, 3)));
233 }
234
235 @Test
236 public void shouldDequeueOption() {
237 assertThat(Queue.empty().dequeueOption()).isEqualTo(Option.none());
238 assertThat(Queue.of(1, 2, 3).dequeueOption()).isEqualTo(Option.of(Tuple.of(1, Queue.of(2, 3))));
239 }
240
241
242
243 private Queue<Integer> enqueued() {
244 return Queue.of(1).enqueue(2, 3, 1, 5, 6);
245 }
246
247
248
249 @Test
250 public void shouldGetFrontEnc() {
251 assertThat(enqueued().get(0)).isEqualTo(1);
252 }
253
254 @Test
255 public void shouldGetRearEnc() {
256 assertThat(enqueued().get(1)).isEqualTo(2);
257 }
258
259
260
261 @Test
262 public void shouldTakeFrontEnc() {
263 assertThat(enqueued().take(1)).isEqualTo(of(1));
264 }
265
266
267
268 @Test
269 public void shouldInsertAllEnc() {
270 assertThat(enqueued().insertAll(0, List.of(91, 92))).isEqualTo(of(91, 92, 1, 2, 3, 1, 5, 6));
271 assertThat(enqueued().insertAll(1, List.of(91, 92))).isEqualTo(of(1, 91, 92, 2, 3, 1, 5, 6));
272 assertThat(enqueued().insertAll(2, List.of(91, 92))).isEqualTo(of(1, 2, 91, 92, 3, 1, 5, 6));
273 assertThat(enqueued().insertAll(6, List.of(91, 92))).isEqualTo(of(1, 2, 3, 1, 5, 6, 91, 92));
274 }
275
276
277
278 @Test
279 public void shouldInsertEnc() {
280 assertThat(enqueued().insert(0, 9)).isEqualTo(of(9, 1, 2, 3, 1, 5, 6));
281 assertThat(enqueued().insert(1, 9)).isEqualTo(of(1, 9, 2, 3, 1, 5, 6));
282 assertThat(enqueued().insert(2, 9)).isEqualTo(of(1, 2, 9, 3, 1, 5, 6));
283 assertThat(enqueued().insert(6, 9)).isEqualTo(of(1, 2, 3, 1, 5, 6, 9));
284 }
285
286
287
288 @Test
289 public void shouldIntersperseEnc() {
290 assertThat(enqueued().intersperse(9)).isEqualTo(of(1, 9, 2, 9, 3, 9, 1, 9, 5, 9, 6));
291 }
292
293
294
295 @Test
296 public void shouldNotFindIndexOfElementWhenStartIsGreaterEnc() {
297 assertThat(enqueued().indexOf(2, 2)).isEqualTo(-1);
298
299 assertThat(enqueued().indexOfOption(2, 2)).isEqualTo(Option.none());
300 }
301
302 @Test
303 public void shouldFindIndexOfFirstElementEnc() {
304 assertThat(enqueued().indexOf(1)).isEqualTo(0);
305
306 assertThat(enqueued().indexOfOption(1)).isEqualTo(Option.some(0));
307 }
308
309 @Test
310 public void shouldFindIndexOfInnerElementEnc() {
311 assertThat(enqueued().indexOf(2)).isEqualTo(1);
312
313 assertThat(enqueued().indexOfOption(2)).isEqualTo(Option.some(1));
314 }
315
316 @Test
317 public void shouldFindIndexOfLastElementEnc() {
318 assertThat(enqueued().indexOf(3)).isEqualTo(2);
319
320 assertThat(enqueued().indexOfOption(3)).isEqualTo(Option.some(2));
321 }
322
323
324
325 @Test
326 public void shouldNotFindLastIndexOfElementWhenEndIdLessEnc() {
327 assertThat(enqueued().lastIndexOf(3, 1)).isEqualTo(-1);
328
329 assertThat(enqueued().lastIndexOfOption(3, 1)).isEqualTo((Option.none()));
330 }
331
332 @Test
333 public void shouldFindLastIndexOfElementEnc() {
334 assertThat(enqueued().lastIndexOf(1)).isEqualTo(3);
335 }
336
337 @Test
338 public void shouldFindLastIndexOfElementWithEndEnc() {
339 assertThat(enqueued().lastIndexOf(1, 1)).isEqualTo(0);
340
341 assertThat(enqueued().lastIndexOfOption(1, 1)).isEqualTo(Option.some(0));
342 }
343
344
345
346 @Test
347 public void shouldTransform() {
348 final String transformed = of(42).transform(v -> String.valueOf(v.get()));
349 assertThat(transformed).isEqualTo("42");
350 }
351
352
353
354 @Test
355 public void shouldUnfoldRightToEmpty() {
356 assertThat(Queue.unfoldRight(0, x -> Option.none())).isEqualTo(empty());
357 }
358
359 @Test
360 public void shouldUnfoldRightSimpleQueue() {
361 assertThat(Queue.unfoldRight(10, x ->
362 x == 0 ? Option.none() : Option.of(new Tuple2<>(x, x - 1)))
363 ).isEqualTo(of(10, 9, 8, 7, 6, 5, 4, 3, 2, 1));
364 }
365
366 @Test
367 public void shouldUnfoldLeftToEmpty() {
368 assertThat(Queue.unfoldLeft(0, x -> Option.none())).isEqualTo(empty());
369 }
370
371 @Test
372 public void shouldUnfoldLeftSimpleQueue() {
373 assertThat(Queue.unfoldLeft(10, x ->
374 x == 0 ? Option.none() : Option.of(new Tuple2<>(x - 1, x)))
375 ).isEqualTo(of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
376 }
377
378 @Test
379 public void shouldUnfoldToEmpty() {
380 assertThat(Queue.unfold(0, x -> Option.none())).isEqualTo(empty());
381 }
382
383 @Test
384 public void shouldUnfoldSimpleQueue() {
385 assertThat(Queue.unfold(10, x ->
386 x == 0 ? Option.none() : Option.of(new Tuple2<>(x - 1, x)))
387 ).isEqualTo(of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
388 }
389
390
391
392 @Test
393 public void shouldCheckHashCodeWhenComparing() {
394 assertThat(Queue.of(0, null).equals(Queue.of(0, 0))).isFalse();
395 }
396
397
398
399 @Test
400 public void shouldReturnSelfOnConvertToQueue() {
401 final Value<Integer> value = of(1, 2, 3);
402 assertThat(value.toQueue()).isSameAs(value);
403 }
404
405
406
407 @Test
408 public void shouldHaveSizedSpliterator() {
409 assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED)).isTrue();
410 }
411
412 @Test
413 public void shouldReturnSizeWhenSpliterator() {
414 assertThat(of(1, 2, 3).spliterator().getExactSizeIfKnown()).isEqualTo(3);
415 }
416 }